package jxc.data.hibernate.dao;

import java.util.Date;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 * 功能描述：持久层对象的基础操作类
 * 
 * @author Eternal
 * 
 */
public abstract class HibernateBaseDAO<T> {

	protected Session session = null;

	protected Transaction trans = null;

	/**
	 * 开始时间
	 */
	protected Date beginTime;

	/**
	 * 结束时间
	 */
	protected Date endTime;

	/**
	 * 构造方法：开始事务
	 * 
	 */
	public HibernateBaseDAO() {
		trans = getSession().beginTransaction();
		session.clear();
	}

	/**
	 * 功能描述：获取当前的session
	 * 
	 * @return session
	 */
	private Session getSession() {
		session = HibernateSessionFactory.getSession();
		return session;
	}

	/**
	 * 提交事务
	 * 
	 */
	public void commit() {
		if (trans == getSession().getTransaction()) 
			trans.commit();
		trans=getSession().beginTransaction();
	}

	/**
	 * 功能描述：回滚数据库操作
	 * 
	 * @throws Exception
	 */
	public void rollback() {
		try {
			if (trans != null && trans.isActive()) {
				trans.rollback();
				trans = null;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 保存对象信息到数据库
	 * 
	 * @param obj
	 *            需要持久化的对象
	 */
	public void save(T obj) {
		session.save(obj);
	}

	/**
	 * 保存或更新对象信息到数据库
	 * 
	 * @param obj
	 *            需要持久化的对象
	 */
	public void saveOrUpdate(T obj) {
		session.saveOrUpdate(obj);
	}

	/**
	 * 更新持久化对象
	 * 
	 * @param obj
	 *            需要更新的对象
	 */
	public void update(T obj) {
		session.update(obj);
	}

	/**
	 * 利用HQL语句进行查询
	 * 
	 * @param hql
	 * @return
	 */
	public List<T> listByHQL(String hql) {
		@SuppressWarnings("unchecked")
		List<T> result = session.createQuery(hql).list();
		return result;
	}

	/**
	 * 分页获取数据
	 * 
	 * @param hql
	 * @param startNum
	 * @param pageSize
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<T> listByHQL(String hql, int startNum, int pageSize) {
		Query q = session.createQuery(hql);
		if (beginTime != null) {
			q.setDate("d1", beginTime);
		}
		if (endTime != null) {
			q.setDate("d2", endTime);
		}
		beginTime = null;
		endTime = null;
		q.setFirstResult(startNum);
		q.setMaxResults(pageSize);
		return q.list();
	}

	/**
	 * 利用HQL语句进行对象的查询
	 * 
	 * @param hql
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public T getByHQL(String hql) {
		Query q = session.createQuery(hql);
		if (beginTime != null) {
			q.setDate("d1", beginTime);
		}
		if (endTime != null) {
			q.setDate("d2", endTime);
		}
		return (T) q.uniqueResult();
	}

	/**
	 * 根据ID得到持久化对象
	 * 
	 * @param cls
	 * @param id
	 * @return
	 */
	public T getById(Class<T> cls, java.io.Serializable id) {
		@SuppressWarnings("unchecked")
		T result = (T) session.get(cls, id);
		return result;
	}

	/**
	 * 删除一个对象
	 * 
	 * @param obj
	 */
	public void delete(T obj) {
		session.delete(obj);
	}

	/**
	 * 关闭session
	 * 
	 */
	public void closeSession() {
		HibernateSessionFactory.closeSession();
	}

	/**
	 * 执行HQL语句
	 * 
	 * @param hql
	 * @throws Exception
	 */
	public int executeUpdateHQL(String hql) throws Exception {
		return session.createQuery(hql).executeUpdate();
	}
	

}
